package br.tads.poo.notas.gerencia;
import java.sql.Date;
import java.util.ArrayList;

import br.tads.poo.notas.excecoes.CaracteresInsulficientesException;
import br.tads.poo.notas.excecoes.EntradaStringVaziaException;
import br.tads.poo.notas.excecoes.PrioridadeInvalidaException;
import br.tads.poo.notas.objetos.*;

public class Caderno {
	public String nome;
	private ArrayList<Nota> notas = new ArrayList<Nota>();
	private Date data;

	public Caderno(String nome) throws CaracteresInsulficientesException{ 
		if(nome.equals("")){
			throw new CaracteresInsulficientesException("- O nome do caderno não pode ser vazio.");
		}
		this.nome = nome; 
	}

	public String getNome(){ return nome; }

	public void setNome(String nome)  throws EntradaStringVaziaException { 
		if(nome.equals("")){
			throw new EntradaStringVaziaException("- O nome do caderno não pode ser vazio.");
		}
		this.nome = nome; 
	}

	public String criarNota(String nome, String descricao, int prioridade) throws EntradaStringVaziaException, PrioridadeInvalidaException{
		try{
			for(int i = 0; i < notas.size(); i++){
				if(nome.equals(notas.get(i).getTitulo())){
					return "- Nome existente.";
				}
			}
			Nota nota = new Nota(nome, descricao, prioridade);
			notas.add(nota);
			return "- Nota criada.";
		}
		catch(EntradaStringVaziaException e){	
			return e.getMessage();
		}
		catch(PrioridadeInvalidaException e){
			return e.getMessage();
		}
	}

	public String criarLembrete(String nome, String descricao, int prioridade, int dia, int mes, int ano) throws EntradaStringVaziaException, PrioridadeInvalidaException{
		try{
			for(int i = 0; i < notas.size(); i++){
				if(nome.equals(notas.get(i).getTitulo())){
					return "- Nome existente."; 
				}
			}
			Lembrete lembrete = new Lembrete(nome, descricao, prioridade, dia, mes, ano);
			notas.add(lembrete);
			return "- Lembrete criado.";
		}
		catch(EntradaStringVaziaException	e){	
			return e.getMessage();
		}
		catch(PrioridadeInvalidaException e){
			return e.getMessage();
		}
	}

	public Nota verNota(String nome){
		for(int i = 0; i < notas.size(); i++){
			if(nome.equalsIgnoreCase(notas.get(i).getTitulo())){
				return notas.get(i);
			}
		}
		return null;
	}

	public String editarNotaNome(String nome, String novoNome){
		for(int i = 0; i < notas.size(); i++){
			if(novoNome.equals(notas.get(i).getTitulo())){
				return "- Nome existente.";
			}
		}
		for(int i = 0; i < notas.size(); i++){
			if(nome.equals(notas.get(i).getTitulo())){
				notas.get(i).setTitulo(novoNome);
				return "- Nome alterado.";
			}
		}
		return "- Nota não encontrada.";
	}

	public String editarNotaDescricao(String nome, String novoNome){
		for(int i = 0; i < notas.size(); i++){
			if(nome.equals(notas.get(i).getTitulo())){
				notas.get(i).setDescricao(novoNome);
				return "- Descricao alterada.";
			}
		}
		return "- Nota não encontrada.";
	}

	public String editarPrioridade(String nome, int novaPrioridade){
		for(int i = 0; i < notas.size(); i++){
			if(nome.equals(notas.get(i).getTitulo())){
				notas.get(i).setPrioridade(novaPrioridade);
				return "- Prioridade alterada.";
			}
		}
		return "- Nota não encontrada.";
	}

	public String editarStatus(String nome, int novoStatus){
		for(int i = 0; i < notas.size(); i++){
			if(nome.equals(notas.get(i).getTitulo())){
				notas.get(i).setStatus(2);
				return "- Status alterado.";
			}
		}
		return "- Nota/lembrete não encontrado.";
	}
	
	@SuppressWarnings("deprecation")
	public String adiarLembrete(String nome, int dias){
		for(int i = 0; i < notas.size(); i++){
			if(nome.equals(notas.get(i).getTitulo()) && notas.get(i) instanceof Lembrete){
				Lembrete lembrete = (Lembrete) notas.get(i);
				data = new Date(lembrete.getData().getYear(), lembrete.getData().getMonth(), lembrete.getData().getDate() + dias);
				lembrete.setData(data);
				return "- Lembrete adiado.";
			}
		}
		return "- Nota/lembrete não encontrado.";
	}
	
	public ArrayList<Nota> verNotas(){
		return notas;
	}

	public String excluirNota(String nome){
		for(int i = 0; i < notas.size(); i++){
			if(nome.equals(notas.get(i).getTitulo())){
				notas.remove(notas.get(i));
				return "- Nota/lembrete removido con sucesso.";
			}
		}
		return "- Nota/lembrete não encontrado.";
	}
}